package cn.gson.springboot.model.service.privilegeservice;

import cn.gson.springboot.model.dao.privilegedao.DeptDao;
import cn.gson.springboot.model.dao.privilegedao.MenuDao;
import cn.gson.springboot.model.dao.privilegedao.PermissionssetDao;
import cn.gson.springboot.model.dao.privilegedao.PositionDao;
import cn.gson.springboot.model.mapper.privilegemapper.DeptMapper;
import cn.gson.springboot.model.pjos.Dept;
import cn.gson.springboot.model.pjos.Menu;
import cn.gson.springboot.model.pjos.Permissionsset;
import cn.gson.springboot.model.pjos.Position;
import cn.gson.springboot.model.vo.privilegevo.DeptVo;
import cn.gson.springboot.model.vo.privilegevo.PositionVo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.CriteriaBuilder;
import java.util.ArrayList;
import java.util.List;

@Service
@Transactional
public class DeptService {
    @Autowired
    DeptMapper deptMapper;

    @Autowired
    DeptDao deptDao;

    @Autowired
    PermissionssetDao permissionssetDao;

    @Autowired
    PositionDao positionDao;

    @Autowired
    MenuDao menuDao;


    /**
     * 递归查询部门及下级部门
     * @return
     */
    public List<DeptVo> deptTree(){
        return deptMapper.deptTree(0);
    }


   /* 根据部门id查询职务*/
    public List<PositionVo> positionTree(int deptId){
        return deptMapper.positionTree(deptId);
    }

    /**save部门*/
    public void saveDept(Dept dept){
        deptDao.save(dept);
    }

   /* 所有权限组*/
    public List<Permissionsset> permissionGroup(){
        return deptMapper.permissionGroup();
    }

    /*部门拥有的权限*/
    public List<Integer> deptPermissionGroup(Integer deptId){
        return deptMapper.deptPermissionGroup(deptId);
    }

   /* save部门权限组*/
    public void savePermissionsset(String perminssionsset){
        JSONObject obj = (JSONObject)JSONObject.parse(perminssionsset);
       Integer deptId = (Integer) obj.get("deptId");
       List array = obj.getObject("permissionList",List.class);
        //查询部门
        Dept dept=deptDao.findById(deptId).get();
        //通过部门id获取getPermissionssetList()
        List<Permissionsset> permissionssetList=dept.getPermissionssetList();
        if(permissionssetList.size()==0){
            permissionssetList = new ArrayList<>();
        }
        //给permissionssetList添加对象
        permissionssetList.clear();
        permissionssetList.addAll((List)permissionssetDao.findAllById(array));

        //重新给集合赋值,相当于执行中间表的新增
        dept.setPermissionssetList(permissionssetList);
    }
    /*查询部门拥有的权限组，权限组里拥有的子权限*/
    public  List<Permissionsset> deptMeun(Integer deptId){
        return deptMapper.deptMeun(deptId);
    }

    /*职务下拥有的子权限*/
    public List<Integer> positionMeun(Integer postId){
        return deptMapper.positionMeun(postId);

    }

  /*  save职务的子权限*/
    public void savePositionMeun(String positionMeun){
        JSONObject obj = (JSONObject)JSONObject.parse(positionMeun);
        Integer postId = (Integer) obj.get("postId");
        List array = obj.getObject("positionMeunList",List.class);
        //查询职务
        Position position=positionDao.findById(postId).get();
        //通过职务id获取getMenuList()
        List<Menu> List=position.getMenuList();
        if(List.size()==0){
            List = new ArrayList<>();
        }
        //给permissionssetList添加对象
        List.clear();
        List.addAll((List)menuDao.findAllById(array));
        //重新给集合赋值,相当于执行中间表的新增
        position.setMenuList(List);

    }

    /**
     * 删除部门
     * @param deptId
     * @return
     */
    public int deleteDept(Integer deptId){
       /*判断需删除的部门
        *1.部门下是否有下属部门
        * 2.部门是否存在员工
        * 满足两个条件任意一个 ，即删除失败
        * */
        List<Dept> fatherDept = deptDao.fatherDept(deptId);
        if(fatherDept.size()==0){
            Integer num=countDeptEmp(deptId);
            if(num>0){
                return 2;//存在员工,删除失败
            }else{
                //删除
                Dept dept = deptDao.findById(deptId).get();
                deptDao.delete(dept);
                return 0;
            }
        }else{
            return 1;//存在下属部门 ,删除失败
        }

    }

    /**
     * 该部门有多少个在职员工
     * @param deptId
     * @return
     */
    public Integer countDeptEmp(Integer deptId){
        return deptMapper.countDeptEmp(deptId);
    }

    /* 该职务下有多少在职员工*/
    public Integer countPositionEmp(Integer postId){
        return deptMapper.countPositionEmp(postId);
    }

    /**多个职务新增*/
    public void addPosition(String positionList) {
        JSONObject object = (JSONObject) JSONObject.parse(positionList);
        Integer deptId = (Integer) object.get("deptId");//取到部门id
        Dept dept = new Dept();//实列化部门对象
        dept.setDeptsId(deptId);
        Position position = null;
        JSONObject jsonObject =null;
        List list = object.getObject("positionList",List.class);
        JSONArray array = (JSONArray) JSONArray.parseArray(String.valueOf(list));
        for(int i=0;i<array.size();i++){
            jsonObject = (JSONObject)array.get(i);
            String postName = jsonObject.getString("value");
            position=new Position();
            position.setDept(dept);
            position.setPostName(postName);
            position.setPostLevel(2);//默认设置为二级角色
            positionDao.save(position);
        }

    }
    /*修改职务名称*/
    public void updatePosition(Position position){
        positionDao.save(position);
    }
    /* 删除职务*/
    public int deletePosition(Integer postId) {
        //判断需删除的职务下是否存在员工，不存在则可以删除，否则删除失败
        Integer num = countPositionEmp(postId);
        if(num>0){
            return 1;//存在，删除失败
        }else{
            //删除
            Position position = positionDao.findById(postId).get();
            positionDao.delete(position);
            return 0;
        }
    }
    /* 用于查询部门名称是否存在*/
    public int findDeptIsNo(String deptName){
        Integer id = deptMapper.findDeptIsNo(deptName);//查询一下部门名称
        if(id != null){//如果idid不等于null 说明数据库已存在相同的部门名称 返回1
            return  1;
        }else{
            return  0; //否则不存在相同的部门名称 返回0
        }

    }
    /*用于查询职务下的名称是否存在*/
    public int findPositionIsNo(Integer deptId,  String postName){
        Integer id = deptMapper.findPositionIsNo(deptId,postName);//查询一下职务名称
        if(id != null){//如果id不等于null 说明数据库已存在相同的职务名称 返回1
            return  1;
        }else{
            return  0; //否则不存在职务的部门名称 返回0
        }
    }

    /**
     * 设置一级角色或者取消一级角色
     * @param position
     */
    public void setPostLevel(String position) {
        /**设置一级角色(注:一个部门只有一个一级角色)
         * 1.先查选部门是否已有一级角色 已有的话，把已有的一级角色取消
         * 2.把需要设置为一级角色的角色设置成一级角色
         *
         * 取消一级角色，获取角色id直接取消
         */
        JSONObject obj = (JSONObject) JSONObject.parse(position) ;//把字符串转化成JSON对象
        Integer deptId = obj.getInteger("deptId");//部门id
        Integer postId = obj.getInteger("postId");//角色id
        Integer postLevel = obj .getInteger("postLevel");//角色级别
        Position position1 = positionDao.firstPost(deptId,1);//查询部门是否有一级角色
        if(position1 !=null){//已有的话先取消一级角色
            Position cancelFirst = positionDao.findById(position1.getPostId()).get();
            cancelFirst.setPostLevel(2);
            positionDao.save(cancelFirst);
        }
        //直接设置
        Position setLevel = positionDao.findById(postId).get();
        setLevel.setPostLevel(postLevel);
        positionDao.save(setLevel);
    }


}
